import axios from 'axios';
import store from '@/store';
import router from '@/router';
// import { ElMessage } from 'element-plus';

// axios 初始化
const instance = axios.create({
  baseURL: '/',
  timeout: 10000,
  headers: { 'Content-Type': 'application/json;charset=UTF-8' }
});

// axios 请求拦截器
instance.interceptors.request.use((config) => {
  // 获取用户信息对象
  const token = localStorage.getItem('USER_TOKEN_KEY') || '';
  // 判断是否有 token
  if (token) {
    // 设置 token
    config.headers.Authorization = token;
  }
  return config;
}, (err) => {
  return Promise.reject(err);
});

// axios 响应拦截器
instance.interceptors.response.use((res) => {
  // 约定只接受 code 为 200，即非 200 为响应不成功
  if (res.data?.code !== 200) {
    // 若响应不成功，可以选择在此处进行全局信息提示
    ElMessage.error(res.data?.msg || '服务繁忙，请稍后重试');
    return Promise.reject(res.data);
  }
  // 响应成功，则返回响应数据
  return res.data;
}, (err) => {
  // 401 状态码，进入该函数（表示登录失效，需要进一步操作）
  if (err.response && err.response.status === 401) {
    // 清空无效用户信息
    localStorage.setItem('USER_TOKEN_KEY', '');
    localStorage.setItem('USER_INFO_KEY', '');
    // 跳转到登录页
    router.push('/login');
    // 跳转需要传参（当前路由地址）给登录页面，方便登录后直接返回到当前路由地址
    const fullPath = encodeURIComponent(router.currentRoute.value.fullPath);
    router.push('/login?redirect=' + fullPath);
  }
  // 超出 2xx 范围的状态码都会触发该函数，返回错误信息
  return Promise.reject(err);
});

// 导出请求方法
export function getRequest(url, params) {
  return instance({
    method: 'GET',
    url: `${url}`,
    params: params
  });
}

export function postRequest(url, params) {
  return instance({
    method: 'POST',
    url: `${url}?${new URLSearchParams(params)}`,
  });
}

export default instance;